feat: generate release notes with LLM#77
Conversation
karthikbekalp
left a comment
There was a problem hiding this comment.
Nice! It was always painful to review the changelog. This hopefully makes it easier to review as there is an additional pair of eyes checking this.
82da151
95c328c to
82da151
Compare
|
I think we also need to update workflows/reusable_bump.yml Also, we could consider removing scripts/get_latest_changelog.py and workflows/reusable_publish.yml |
| body = json.loads(response["body"].read()) | ||
|
|
||
| for block in body.get("content", []): | ||
| if block.get("type") == "tool_use" and block.get("name") == "emit_release_notes": |
There was a problem hiding this comment.
I am a little confused about how we are using the emit_release_notes here.
I don't see we have any tool method naming emit_release_notes and seems what we do if the tool is needed is just to return the input's entries ? What's usage of this tool ?
There was a problem hiding this comment.
emit_release_notes is defined in the TOOL_DEFINITION above.
LLMs take a text prompt and a list of "tool definitions" as input and return text and "tool calls" in response. Tool definitions are just JSON schemas and tool calls are just JSON. They're usually wired up to a function call so if the LLM returns a tool call, a function gets called. But more precisely, they're just a mechanism for LLMs to return structured JSON. Here, we're modeling changelog items as tool calls we can be sure each item matches one of the categories and has a reference with it.
82da151 to
4f011f0
Compare
Add .github/scripts/generate_release_notes.py which uses Bedrock (Claude Opus 4.6 via cross-region inference) to generate customer-facing release notes from git commits and PR descriptions using LLM tool use. Update reusable_bump.yml to use Bedrock-generated notes instead of scraping raw CHANGELOG.md entries via get_latest_changelog.py. The release workflows (reusable_release.yml, reusable_publish_v2.yml) continue to read from CHANGELOG.md so the GitHub release body always matches the committed changelog. Requires bedrock:InvokeModel permission on the OpenPGPOIDCRole (BealineClientSoftwareCDK CR-268154405, already merged). Signed-off-by: Stephen Crowe <6042774+crowecawcaw@users.noreply.github.com>
4f011f0 to
fcace00
Compare
|
@Cherie-Chen good catch! Revised. I also tested the bump workflow from my fork which generated this PR: crowecawcaw/deadline-cloud#4 |
What was the problem/requirement? (What/Why)
Release notes are annoying to write and difficult to write well. But we have lots of good context to form them in the PRs.
What was the solution? (How)
Have an LLM generate the release notes. The change has Opus 4.6 generate the notes. It takes PR descriptions and some instructions and generates a series of bullet points for the notes. The LLM returns notes as strictly typed tool calls, then our script generates the file text from those bullet points.
The script invokes the LLM once, directly, to generate text. It is not running an agent. The LLM does not have the ability to do anything except provide text for the template.
What is the impact of this change?
Better quality release notes with less effort.
How was this change tested?
Two ways:
Was this change documented?
n/a
Is this a breaking change?
No
Sample release notes
Features
hooks.yaml or hooks.json in the job bundle directory, or via the DEADLINE_HOOKS_DIR environment variable.
Pre-submission hooks run before hashing/uploading and can modify the submission, while post-submission hooks
run after job creation for notifications and integrations. Hooks are disabled by default and require user
confirmation before execution. (#986)
the GUI submitter. This aligns the GUI submit command with the non-GUI bundle submit command. (#1053)
Bug Fixes
~/.deadline/config file. Path separators are now normalized to prevent different .ini library implementations
from breaking path configurations. (#1098)
path incompatibility). Instead of a cryptic OS error, a clear message now explains the failure and suggests
re-running the download to choose a valid local path. (#1034)
Telemetry is non-essential and will no longer block normal operations if it encounters an error. (#1058)